package com.dkd.system.utils;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.ByteArrayOutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Base64;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class LuckySheetQRCodeReplacer {

//    public static void main(String[] args) {
//        try {
//            // 1. 定义文件路径（使用绝对路径）
//            Path srcPath = Paths.get("C:\\Users\\19747\\Desktop\\luckysheet_data.json");
//            Path destPath = Paths.get("C:\\Users\\19747\\Desktop\\luckysheet_data_updated.json"); // 新文件避免覆盖
//
//            // 2. 读取+替换+写入（原子操作）
//            String updatedJson = replaceImageWithQRCode(
//                    Files.readString(srcPath),
//                    0,
//                    "http://localhost:8090/42"
//            );
//            Files.writeString(destPath, updatedJson, StandardOpenOption.CREATE);
//        } catch (Exception e) {
//            System.err.println("操作失败:");
//            e.printStackTrace();
//        }
//    }

    public static Map<String, String> replaceImageWithQRCode(String jsonStr, int targetIndex, String qrContent) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
            JsonNode root = mapper.readTree(jsonStr);
        String qrBase64 ="";
        // 1. 定位到目标images对象
        ObjectNode images = (ObjectNode) root.get(0).get("images");
        // 2. 按索引找到目标图片
        Iterator<Map.Entry<String, JsonNode>> it = images.fields();
//        while (it.hasNext()) {  //取消图片判断限制
        for (int i = 0; it.hasNext() && i <= targetIndex; i++) {
            Map.Entry<String, JsonNode> entry = it.next();
                ObjectNode img = (ObjectNode) entry.getValue();
                String currentSrc = img.path("src").asText();
                // 3. 判断是否是二维码（简单检测）
//                if (isQRCode(currentSrc)) {
                if (QRCodeDetector.isQRCode(currentSrc)) { //调用python脚本验证
                    System.out.println("进入到新的二维码替换");
                    // 4. 生成新二维码（保持原尺寸）
                     qrBase64 = generateQRCodeBase64(
                            qrContent,
                            img.path("crop").path("width").asInt(),
                            img.path("crop").path("height").asInt()
                    );
                    // 5. 替换src
                    img.put("src", qrBase64);
                }
        }
//        }
        String json = mapper.writeValueAsString(root);
        Map<String, String> map = new HashMap<>();
        map.put("json",json);
        map.put("qrcode",qrBase64);
        return map;
    }
    /**
     * 使用zxing解码 判断是否原来是二维码
     * @param src 原来base64
     * @return
     */
    private static boolean isQRCode(String src) {
        try {
            if (!src.startsWith("data:image/png;base64,")) {
                return false;
            }

            String base64Data = src.substring(22);
            byte[] imageData = Base64.getDecoder().decode(base64Data);

            // 使用ZXing尝试解码
            BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageData));
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

            QRCodeReader reader = new QRCodeReader();
            Result result = reader.decode(bitmap);
            return result != null; // 如果能解码出内容，则确定是二维码
        } catch (Exception e) {
            return false; // 解码失败说明不是二维码
        }
    }
    /**
     * 生成 Base64 格式的二维码（优化边距）
     * @param content 二维码内容
     * @param width   宽度（像素）
     * @param height  高度（像素）
     */
    public static String generateQRCodeBase64(String content, int width, int height) throws Exception {
        QRCodeWriter writer = new QRCodeWriter();

        // 设置二维码参数（减少边距）
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.MARGIN, 1); // 设置边距为1（最小为1）
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 纠错级别

        // 生成二维码矩阵
        BitMatrix matrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(matrix, "PNG", os);

        return "data:image/png;base64," + Base64.getEncoder().encodeToString(os.toByteArray());
    }

    public static void main(String[] args) {
        String qrcode = "";

        boolean qrCode = isQRCode(qrcode);

        System.out.println("qrCode = " + qrCode);
    }
}